package DynamicProgramming;//在一个由 '0' 和 '1' 组成的二维矩阵内，找到只包含 '1' 的最大正方形，并返回其面积。
//
// 
//
// 示例 1： 
//
// 
//输入：matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"]
//,["1","0","0","1","0"]]
//输出：4
// 
//
// 示例 2： 
//
// 
//输入：matrix = [["0","1"],["1","0"]]
//输出：1
// 
//
// 示例 3： 
//
// 
//输入：matrix = [["0"]]
//输出：0
// 
//
// 
//
// 提示： 
//
// 
// m == matrix.length 
// n == matrix[i].length 
// 1 <= m, n <= 300 
// matrix[i][j] 为 '0' 或 '1' 
// 
// Related Topics 数组 动态规划 矩阵 👍 1126 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
class maximalSquare {
    public int maximalSquare(char[][] matrix) {
        int rows = matrix.length;
        if(rows==0){
            return 0;
        }
        int cols = matrix[0].length;
        //可考虑动态规划,dp[i][j]表示以 以i,j为下标的最大正方形边长
        int[][] dp = new int[rows+1][cols+1];
        //初始化
        int max = 0;
        //状态转移,可以看出当1作为右下角时，能构成正方形取决于，左边，上边和斜对角的值
        for(int i=1;i<=rows;i++){
            for(int j=1;j<=cols;j++){
                if(matrix[i-1][j-1]=='1'){
                    dp[i][j] = 1 + Math.min(Math.min(dp[i-1][j-1],dp[i-1][j]),dp[i][j-1]);
                    max = Math.max(dp[i][j],max);
                }
            }
        }


        return max*max;
    }
}
//leetcode submit region end(Prohibit modification and deletion)
